package com.fdq.dianping.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fdq.dianping.entity.Result;
import com.fdq.dianping.entity.ShopComment;
import com.fdq.dianping.entity.VoucherOrder;
import com.fdq.dianping.service.IVoucherOrderService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 优惠券订单控制器，处理优惠券订单相关的所有业务操作
 * </p>
 *
 * @author fdq
 * @since 2024-12-29
 */
@RestController
@RequestMapping("/voucher-order")
public class VoucherOrderController {

    @Resource
    private IVoucherOrderService voucherOrderService;

    /**
     * 秒杀优惠券下单接口
     * 
     * @param voucherId 优惠券ID
     * @return Result 下单结果
     * 
     * 业务逻辑：
     * 1. 执行秒杀资格验证
     * 2. 检查库存是否充足
     * 3. 检查用户是否已经购买过（一人一单）
     * 4. 扣减库存
     * 5. 创建订单
     * 6. 返回订单创建结果
     */
    @PostMapping("seckill/{id}")
    public Result seckillVoucher(@PathVariable("id") Long voucherId){
        return voucherOrderService.seckillVoucher(voucherId);
    }

    /**
     * 普通优惠券下单接口
     * 
     * @param voucherId 优惠券ID
     * @return Result 下单结果
     * 
     * 业务逻辑：
     * 1. 检查优惠券是否存在且有效
     * 2. 检查库存是否充足
     * 3. 创建订单记录
     * 4. 扣减库存
     * 5. 返回订单创建结果
     */
    @PostMapping("voucher/{id}")
    public Result voucher(@PathVariable("id") Long voucherId){
        return voucherOrderService.createVoucherOrder(voucherId);
    }

    /**
     * 优惠券订单退款接口
     * 
     * @param voucherOrderId 优惠券订单ID
     * @return Result 退款处理结果
     * 
     * 业务逻辑：
     * 1. 检查订单是否存在
     * 2. 验证订单状态是否允许退款
     * 3. 更新订单状态为已退款
     * 4. 恢复优惠券库存
     * 5. 处理退款业务
     */
    @PostMapping("refundVoucher/{id}")
    public Result refundVoucher(@PathVariable("id")Long voucherOrderId ){
        return voucherOrderService.refundVoucher(voucherOrderId);
    }

    /**
     * 优惠券订单支付接口
     * 
     * @param voucherOrderId 优惠券订单ID
     * @return Result 支付处理结果
     * 
     * 业务逻辑：
     * 1. 检查订单是否存在
     * 2. 验证订单状态是否为未支付
     * 3. 处理支付逻辑
     * 4. 更新订单状态为已支付
     * 5. 返回支付结果
     */
    @PostMapping("payVoucher/{id}")
    public Result payVoucher(@PathVariable("id")Long voucherOrderId ){
        return voucherOrderService.payVoucher(voucherOrderId);
    }

    /**
     * 优惠券核销接口
     * 
     * @param voucherOrderId 优惠券订单ID
     * @return Result 核销处理结果
     * 
     * 业务逻辑：
     * 1. 检查订单是否存在
     * 2. 验证订单状态是否为已支付
     * 3. 验证优惠券是否在有效期内
     * 4. 更新订单状态为已使用
     * 5. 记录核销时间
     */
    @PostMapping("useVoucher/{id}")
    public Result useVoucher(@PathVariable("id")Long voucherOrderId){
        return voucherOrderService.useVoucher(voucherOrderId);
    }

    /**
     * 查询用户的优惠券订单列表
     * 
     * @param uid 用户ID
     * @return Result 包含用户的优惠券订单列表
     * 
     * 业务逻辑：
     * 1. 构建查询条件，指定用户ID
     * 2. 查询该用户的所有优惠券订单记录
     * 3. 返回订单列表数据
     * 注：返回的订单包含所有状态（未支付、已支付、已使用、已退款等）
     */
    @GetMapping("getByUserId")
    public Result getByUserId(Long uid){
        QueryWrapper<VoucherOrder> voucherOrderQueryWrapper = new QueryWrapper<>();
        voucherOrderQueryWrapper.eq("user_id",uid);
        List<VoucherOrder> voucherOrders = voucherOrderService.list(voucherOrderQueryWrapper);
        return Result.success(voucherOrders);
    }
}
